當你用 TWD 付給海外商家(USD/EUR…)時,實際入帳金額會受到三件事影響:
今天的程式不連網,所以用「示意匯率」。你可以把數字換成你想測試的值。
# 說明:
# - MID 為示意用「中間價」:1 USD 可換多少其它幣(非即時、非建議價)
# - PCT_FEE 百分比手續費(以來源幣計)
# - FLAT_FEE 固定手續費(以來源幣計)
# - FX_MARGIN 匯率價差(以中間價基礎打折,讓使用者拿到稍不利的匯率)
MID = { # 1 USD = X 目標幣(示意數字,請依需求自行調整)
"USD": 1.00,
"TWD": 32.00,
"EUR": 0.90,
"JPY": 155.00,
}
CURRENCY_SYMBOL = {"USD": "$", "TWD": "NT$", "EUR": "€", "JPY": "¥"}
PCT_FEE = 0.006 # 0.6% 百分比手續費(示意)
FLAT_FEE = { # 固定手續費(以來源幣別計,示意)
"TWD": 30,
"USD": 1.5,
"EUR": 1.5,
"JPY": 200,
}
FX_MARGIN = 0.008 # 匯率價差 0.8%(示意)
def fx_rate(src: str, dst: str) -> float:
"""用中間價計算 src→dst 的理論匯率(dst_per_src)"""
return MID[dst] / MID[src]
def money(cur: str, val: float) -> str:
sym = CURRENCY_SYMBOL.get(cur, "")
if cur in ("TWD", "JPY"):
return f"{sym}{val:,.0f}"
return f"{sym}{val:,.2f}"
def quote(amount_src: float, src: str, dst: str,
pct_fee=PCT_FEE, flat_fee_map=FLAT_FEE, fx_margin=FX_MARGIN):
amt = float(amount_src)
# 1) 手續費(以來源幣計)
pct_fee_amt = amt * pct_fee
flat_fee_amt = float(flat_fee_map.get(src, 0.0))
fees_src = pct_fee_amt + flat_fee_amt
net_src = max(0.0, amt - fees_src)
# 2) 匯率(中間價 → 扣價差)
base_rate = fx_rate(src, dst) # 中間價
eff_rate = base_rate * (1 - fx_margin) # 實際成交匯率(對使用者不利一點點)
# 3) 換匯結果
ideal_dst = amt * base_rate # 理想情況(無任何成本)
margin_loss_dst= ideal_dst * fx_margin # 價差造成的損耗(以目標幣表示)
receive_dst = net_src * eff_rate # 扣完費用且套用價差後,實際可得
return {
"from": src, "to": dst,
"amount_src": amt,
"pct_fee_src": pct_fee_amt,
"flat_fee_src": flat_fee_amt,
"fees_src_total": fees_src,
"net_src_after_fees": net_src,
"mid_rate_src_to_dst": base_rate,
"eff_rate_after_margin": eff_rate,
"fx_margin": fx_margin,
"ideal_dst_no_cost": ideal_dst,
"fx_margin_loss_dst": margin_loss_dst,
"receive_dst": receive_dst,
}
def print_receipt(q: dict):
print(f"=== 換匯報價 | {q['from']} → {q['to']} ===")
print(f"申請金額:{money(q['from'], q['amount_src'])}")
print(f"手續費(%):{money(q['from'], q['pct_fee_src'])}")
print(f"手續費(固定):{money(q['from'], q['flat_fee_src'])}")
print(f"手續費合計:{money(q['from'], q['fees_src_total'])}")
print(f"扣除手續費後淨額:{money(q['from'], q['net_src_after_fees'])}")
print(f"中間價({q['from']}→{q['to']}):{q['mid_rate_src_to_dst']:.6f} {q['to']}/{q['from']}")
print(f"匯率價差(margin):{q['fx_margin']*100:.2f}%")
print(f"實際成交匯率:{q['eff_rate_after_margin']:.6f} {q['to']}/{q['from']}")
print(f"理想可得(無成本):{money(q['to'], q['ideal_dst_no_cost'])}")
print(f"匯率價差損耗:約 {money(q['to'], q['fx_margin_loss_dst'])}")
print(f"➡️ 實際入帳:{money(q['to'], q['receive_dst'])}")
# === 範例 1:用 TWD 付款給美國商家(TWD→USD)===
q1 = quote(amount_src=10000, src="TWD", dst="USD")
print_receipt(q1)
print("\n")
# === 範例 2:用 USD 付款給歐洲商家(USD→EUR)===
q2 = quote(amount_src=300, src="USD", dst="EUR")
print_receipt(q2)